package cmd

import (
	"fmt"
	"sort"
	"strings"
)

// Percent 输入两个整数 a b, 计算 a 占 b 的 百分比, 不保留小数, 也就是返回结果为 0-100 之间的整数。
func Percent(a, b int) int {
	return int(float64(a) / float64(b) * 100)
}

func PercentText(a, b int) string {
	return fmt.Sprintf("%d%%", Percent(a, b))
}

func PercentChars(a, b int) string {
	return IntToChars(Percent(a, b)) + "%"
}

// DeduplicateUintSlice 删除重复元素. 可选是否对结果排序
// slice: 待处理的切片
// sortFlag: 0-不排序, 1-升序, 2-降序
func DeduplicateUintSlice(slice []uint, sortFlag int) []uint {
	// 去重
	seen := make(map[uint]bool)
	result := make([]uint, 0)
	for _, v := range slice {
		if !seen[v] {
			seen[v] = true
			result = append(result, v)
		}
	}

	// 返回排序后切片
	return SortUintSlice(result, sortFlag)
}

// SortUintSlice 对切片排序
// slice: 待处理的切片
// sortFlag: 排序标志，1表示升序，2表示降序. 其他数值比如0表示不排序
func SortUintSlice(slice []uint, sortFlag int) []uint {
	if sortFlag == 1 {
		sort.Slice(slice, func(i, j int) bool {
			return slice[i] < slice[j]
		})
	} else if sortFlag == 2 {
		sort.Slice(slice, func(i, j int) bool {
			return slice[i] > slice[j]
		})
	}
	return slice
}

func JoinUintSlice(slice []uint, sep string) string {
	//虽然最终输出结果看起来没问题，但这种方式存在以下缺点：
	//1. 依赖格式化输出格式
	//fmt.Sprint(slice) 是 Go 标准库对切片的默认打印格式，不是稳定的 API 输入源，未来可能会变化。
	//2. 无法处理带空格或特殊字符的内容
	//如果元素中包含空格、换行等，strings.Fields() 可能会错误地分割。
	//3. 效率较低
	//多次字符串操作（Sprint → Fields → Join → Trim），不如直接遍历高效。
	//return strings.Trim(strings.Join(strings.Fields(fmt.Sprint(slice)), sep), "[]")

	// 对于多个 sizes，生成一个字符串，形如 "64|128|512"
	strSizes := make([]string, len(slice))
	for i, s := range slice {
		strSizes[i] = fmt.Sprintf("%d", s)
	}
	//if sep == "" {
	//	sep = ","
	//}
	return strings.Join(strSizes, sep)
}
